home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / wais / waisgate / ztype1.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  8KB  |  329 lines

  1. /* WIDE AREA INFORMATION SERVER SOFTWARE:
  2.    No guarantees or restrictions.  See the readme file for the full standard
  3.    disclaimer.    
  4. */
  5.   
  6. #ifndef lint
  7. static char *RCSid = "$Header: /tmp_mnt/net/quake/proj/wais/wais-8-b5/ir/RCS/ztype1.c,v 1.2 92/02/12 14:00:49 jonathan Exp $";
  8. #endif
  9.  
  10. /* Change log:
  11.  * $Log:    ztype1.c,v $
  12.  * Revision 1.2  92/02/12  14:00:49  jonathan
  13.  * Added "$Log" so RCS will put the log message in the header
  14.  * 
  15.    3.26.90    Harry Morris, morris@think.com
  16.    4.11.90  HWM - generalized conditional includes (see c-dialect.h)
  17. */
  18.  
  19. #define _C_Type_1_Query_
  20.  
  21. #include "ztype1.h"
  22. #include "cutil.h"
  23. #include "panic.h"
  24. #include <string.h>
  25.  
  26. #ifndef ANSI_LIKE
  27. #include "ustubs.h"
  28. #endif
  29.  
  30. /*----------------------------------------------------------------------*/
  31.  
  32. query_term*
  33. makeAttributeTerm(use,
  34.           relation,
  35.           position,
  36.           structure,
  37.           truncation,
  38.           completeness,
  39.           term)
  40. char* use;
  41. char* relation;
  42. char* position;
  43. char* structure;
  44. char* truncation;
  45. char* completeness;
  46. any* term;
  47. {
  48.   query_term* qt = (query_term*)s_malloc((size_t)sizeof(query_term));
  49.  
  50.   qt->TermType = TT_Attribute;
  51.  
  52.   /* copy in the attributes */
  53.   strncpy(qt->Use,use,ATTRIBUTE_SIZE);
  54.   strncpy(qt->Relation,relation,ATTRIBUTE_SIZE);
  55.   strncpy(qt->Position,position,ATTRIBUTE_SIZE);
  56.   strncpy(qt->Structure,structure,ATTRIBUTE_SIZE);
  57.   strncpy(qt->Truncation,truncation,ATTRIBUTE_SIZE);
  58.   strncpy(qt->Completeness,completeness,ATTRIBUTE_SIZE);
  59.  
  60.   qt->Term = duplicateAny(term);
  61.  
  62.   qt->ResultSetID = NULL;
  63.  
  64.   return(qt);
  65. }
  66.  
  67. /*----------------------------------------------------------------------*/
  68.  
  69. query_term*
  70. makeResultSetTerm(resultSet)
  71. any* resultSet;
  72.   query_term* qt = (query_term*)s_malloc((size_t)sizeof(query_term));
  73.  
  74.   qt->TermType = TT_ResultSetID;
  75.  
  76.   qt->ResultSetID = duplicateAny(resultSet);
  77.  
  78.   qt->Term = NULL;
  79.   
  80.   return(qt);
  81. }
  82.  
  83. /*----------------------------------------------------------------------*/
  84.  
  85. query_term* 
  86. makeOperatorTerm(operatorCode)
  87. char* operatorCode;
  88. {
  89.   query_term* qt = (query_term*)s_malloc((size_t)sizeof(query_term));
  90.  
  91.   qt->TermType = TT_Operator;
  92.  
  93.   strncpy(qt->Operator,operatorCode,OPERATOR_SIZE);
  94.  
  95.   qt->Term = NULL;
  96.   qt->ResultSetID = NULL;
  97.  
  98.   return(qt);
  99. }
  100.  
  101. /*----------------------------------------------------------------------*/
  102.  
  103. void 
  104. freeTerm(qt)
  105. query_term* qt;
  106. {
  107.   switch (qt->TermType)
  108.     { case TT_Attribute:
  109.     freeAny(qt->Term);
  110.     break;
  111.       case TT_ResultSetID:
  112.     freeAny(qt->ResultSetID);
  113.     break;
  114.       case TT_Operator:
  115.     /* do nothing */
  116.     break;
  117.       default:
  118.     panic("Implementation error: Unknown term type %ld",
  119.           qt->TermType);
  120.     break;
  121.       }
  122.   s_free(qt);
  123. }
  124.  
  125. /*----------------------------------------------------------------------*/
  126.  
  127. #define ATTRIBUTE_LIST_SIZE    ATTRIBUTE_SIZE * 6
  128. #define AT_DELIMITER    " "
  129.  
  130. char* 
  131. writeQueryTerm(qt,buffer,len)
  132. query_term* qt;
  133. char* buffer;
  134. long* len;
  135. {
  136.   char* buf = buffer;
  137.   char attributes[ATTRIBUTE_LIST_SIZE];
  138.  
  139.   switch (qt->TermType)
  140.     { case TT_Attribute:
  141.     strncpy(attributes,qt->Use,ATTRIBUTE_LIST_SIZE); 
  142.     s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE);
  143.     s_strncat(attributes,qt->Relation,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); 
  144.     s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE);
  145.     s_strncat(attributes,qt->Position,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); 
  146.     s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE);
  147.     s_strncat(attributes,qt->Structure,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); 
  148.     s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE);
  149.     s_strncat(attributes,qt->Truncation,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); 
  150.     s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE);
  151.     s_strncat(attributes,qt->Completeness,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE);
  152.     buf = writeString(attributes,DT_AttributeList,buf,len);
  153.     buf = writeAny(qt->Term,DT_Term,buf,len);
  154.     break;
  155.       case TT_ResultSetID:
  156.     buf = writeAny(qt->ResultSetID,DT_ResultSetID,buf,len);
  157.     break;
  158.       case TT_Operator:
  159.     buf = writeString(qt->Operator,DT_Operator,buf,len);
  160.     break;
  161.       default:
  162.     panic("Implementation error: Unknown term type %ld",
  163.           qt->TermType);
  164.     break;
  165.       }
  166.  
  167.   return(buf);
  168. }
  169.  
  170. /*----------------------------------------------------------------------*/
  171.  
  172. char* 
  173. readQueryTerm(qt,buffer)
  174. query_term** qt;
  175. char* buffer;
  176. {
  177.   char* buf = buffer;
  178.   char  *attributeList = NULL;
  179.   char* operator = NULL;
  180.   any*     term;
  181.   char* use = NULL;
  182.   char* relation = NULL;
  183.   char* position = NULL;
  184.   char* structure = NULL;
  185.   char* truncation = NULL;
  186.   char* completeness;
  187.   any*    resultSetID = NULL;
  188.   data_tag tag;
  189.  
  190.   
  191.   tag = peekTag(buffer);
  192.  
  193.   switch(tag)
  194.     { case DT_AttributeList:
  195.     buf = readString(&attributeList,buf);
  196.     buf = readAny(&term,buf);
  197.     use = strtok(attributeList,AT_DELIMITER);
  198.     relation = strtok(NULL,AT_DELIMITER);
  199.     position = strtok(NULL,AT_DELIMITER);
  200.     structure = strtok(NULL,AT_DELIMITER);
  201.     truncation = strtok(NULL,AT_DELIMITER);
  202.     completeness = strtok(NULL,AT_DELIMITER);
  203.     *qt = makeAttributeTerm(use,relation,position,structure,
  204.                 truncation,completeness,term);
  205.     s_free(attributeList);
  206.     freeAny(term);
  207.     break;
  208.       case DT_ResultSetID:
  209.     buf = readAny(&resultSetID,buf);
  210.     *qt = makeResultSetTerm(resultSetID);    
  211.     freeAny(resultSetID);
  212.     break;
  213.       case DT_Operator:
  214.     buf = readString(&operator,buf);
  215.     *qt = makeOperatorTerm(operator);
  216.     s_free(operator);
  217.     break;
  218.       default:
  219.     REPORT_READ_ERROR(buf);
  220.     break;
  221.       }
  222.   
  223.   return(buf);
  224. }
  225.  
  226. /*----------------------------------------------------------------------*/
  227.  
  228. static unsigned long getQueryTermSize _AP((query_term* qt));
  229.  
  230. static unsigned long
  231. getQueryTermSize(qt)
  232. query_term* qt;
  233. /* figure out how many bytes it will take to write this query */
  234. {
  235.   unsigned long size;
  236.   static char attributes[] = "11 22 33 44 55 66"; /* we just need this to 
  237.                              calculate its written
  238.                              size */
  239.  
  240.   switch (qt->TermType)
  241.     { case TT_Attribute:
  242.     size = writtenStringSize(DT_AttributeList,attributes);
  243.     size += writtenAnySize(DT_Term,qt->Term);
  244.     break;
  245.       case TT_ResultSetID:
  246.     size = writtenAnySize(DT_ResultSetID,qt->ResultSetID);
  247.     break;
  248.       case TT_Operator:
  249.     size = writtenStringSize(DT_Operator,qt->Operator);
  250.     break;
  251.       default:
  252.     panic("Implementation error: Unknown term type %ld",
  253.           qt->TermType);
  254.     break;
  255.       }
  256.  
  257.   return(size);
  258. }
  259.  
  260. /*----------------------------------------------------------------------*/
  261.  
  262. /* A query is simply a null terminated list of query terms. For 
  263.    transmission, a query is written into an any which is sent as
  264.    the user information field. */
  265.  
  266. any*
  267. writeQuery(terms)
  268. query_term** terms;
  269. {
  270.   any* info = NULL;
  271.   char* writePos = NULL;
  272.   char* data = NULL;
  273.   unsigned long size = 0;
  274.   long remaining = 0;
  275.   long i;
  276.   query_term* qt = NULL;
  277.  
  278.   if (terms == NULL)
  279.     return(NULL);
  280.  
  281.   /* calculate the size of write buffer */
  282.   for (i = 0,qt = terms[i]; qt != NULL; qt = terms[++i])
  283.     size += getQueryTermSize(qt);
  284.  
  285.   data = (char*)s_malloc((size_t)size);
  286.  
  287.   /* write the terms */
  288.   writePos = data;
  289.   remaining = size;
  290.   for (i = 0,qt = terms[i]; qt != NULL; qt = terms[++i])
  291.     writePos = writeQueryTerm(qt,writePos,&remaining);
  292.  
  293.   info = makeAny(size,data);
  294.  
  295.   return(info);
  296. }
  297.  
  298. /*----------------------------------------------------------------------*/
  299.  
  300. query_term**
  301. readQuery(info)
  302. any *info;
  303. {
  304.   char* readPos = info->bytes;
  305.   query_term** terms = NULL;
  306.   query_term* qt = NULL;
  307.   long numTerms = 0;
  308.  
  309.  
  310.   while (readPos < info->bytes + info->size)
  311.     { readPos = readQueryTerm(&qt,readPos);
  312.       if (terms == NULL)
  313.     { terms = (query_term**)s_malloc((size_t)(sizeof(query_term*)*2));
  314.     }
  315.       else
  316.     { terms = 
  317.         (query_term**)s_realloc((char*)terms,
  318.                     (size_t)(sizeof(query_term*)*(numTerms+2)));
  319.       }
  320.       terms[numTerms++] = qt;
  321.       terms[numTerms] = NULL;
  322.     }
  323.  
  324.   return(terms);
  325. }
  326.  
  327. /*----------------------------------------------------------------------*/
  328.